package com.cherry.web.controller.system;

import com.cherry.common.constant.UserConstants;
import com.cherry.common.core.controller.BaseController;
import com.cherry.common.core.domain.AjaxResult;
import com.cherry.common.core.domain.Ztree;
import com.cherry.common.core.domain.entity.SysMajor;
import com.cherry.common.core.domain.entity.SysUser;
import com.cherry.common.core.page.TableDataInfo;
import com.cherry.common.core.text.Convert;
import com.cherry.common.utils.ShiroUtils;
import com.cherry.common.utils.StringUtils;
import com.cherry.framework.shiro.service.SysPasswordService;
import com.cherry.system.service.ISysMajorService;
import com.cherry.system.service.ISysUserService;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 用户信息 控制层
 *
 * @author 孙晨阳
 */
@Controller
@RequestMapping("/system/user")
public class SysUserController extends BaseController {

    private static final String PREFIX = "system/user";

    @Resource
    private ISysUserService userService;

    @Resource
    private SysPasswordService passwordService;

    @Resource
    private ISysMajorService majorService;

    /**
     * 访问/system/user时跳转至用户管理页面
     *
     * @return 跳转的页面
     */
    @GetMapping
    public String user() {
        return PREFIX + "/user";
    }

    /**
     * 根据条件分页查询用户列表
     *
     * @param user 用户信息
     * @return 用户信息集合信息
     */
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(SysUser user) {
        startPage();
        List<SysUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }

    /**
     * 校验登录账号
     */
    @PostMapping("/checkLoginNameUnique")
    @ResponseBody
    public String checkLoginNameUnique(SysUser user) {
        return userService.checkLoginNameUnique(user);
    }

    /**
     * 校验手机号码
     */
    @PostMapping("/checkPhoneUnique")
    @ResponseBody
    public String checkPhoneUnique(SysUser user) {
        return userService.checkPhoneUnique(user);
    }

    /**
     * 校验email邮箱
     */
    @PostMapping("/checkEmailUnique")
    @ResponseBody
    public String checkEmailUnique(SysUser user) {
        return userService.checkEmailUnique(user);
    }

    /**
     * 加载专业列表树
     *
     * @return 专业列表树
     */
    @GetMapping("/majorTreeData")
    @ResponseBody
    public List<Ztree> majorTreeData() {
        return majorService.selectMajorTree(new SysMajor());
    }

    /**
     * 选择专业树（跳转页面）
     *
     * @param majorId 专业ID
     * @param mmap    向页面传递的键值对属性
     * @return 跳转的页面
     */
    @GetMapping("/selectMajorTree/{majorId}")
    public String selectMajorTree(@PathVariable("majorId") Long majorId, ModelMap mmap) {
        mmap.put("major", majorService.selectMajorById(majorId));
        return PREFIX + "/majorTree";
    }

    /**
     * 跳转至新增用户页面
     *
     * @return 跳转的页面
     */
    @GetMapping("/add")
    public String add() {
        return PREFIX + "/add";
    }

    /**
     * 新增保存用户
     *
     * @param user 要新增的用户
     * @return 操作结果
     */
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(@Validated SysUser user) {
        if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user))) {
            return error("新增用户'" + user.getLoginName() + "'失败，登录账号已存在");
        } else if (StringUtils.isNotEmpty(user.getPhoneNumber())
                && UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
            return error("新增用户'" + user.getLoginName() + "'失败，手机号码已存在");
        } else if (StringUtils.isNotEmpty(user.getEmail())
                && UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
            return error("新增用户'" + user.getLoginName() + "'失败，邮箱账号已存在");
        }

        user.setSalt(ShiroUtils.randomSalt());
        user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
        user.setCreateBy(getLoginName());
        return toAjax(userService.insertUser(user));
    }

    /**
     * 跳转至修改用户页面
     *
     * @param userId 要修改的用户的ID
     * @param mmap   传递的属性键值对
     * @return 要跳转的页面
     */
    @GetMapping("/edit/{userId}")
    public String edit(@PathVariable("userId") Long userId, ModelMap mmap) {
        mmap.put("user", userService.selectUserById(userId));
        return PREFIX + "/edit";
    }

    /**
     * 修改用户保存
     *
     * @param user 要修改的用户信息
     * @return 结果
     */
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(@Validated SysUser user) {
        userService.checkUserAllowed(user);
        if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user))) {
            return error("修改用户'" + user.getLoginName() + "'失败，登录账号已存在");
        } else if (StringUtils.isNotEmpty(user.getPhoneNumber())
                && UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
            return error("修改用户'" + user.getLoginName() + "'失败，手机号码已存在");
        } else if (StringUtils.isNotEmpty(user.getEmail())
                && UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
            return error("修改用户'" + user.getLoginName() + "'失败，邮箱账号已存在");
        }
        user.setUpdateBy(getLoginName());
        return toAjax(userService.updateUser(user));
    }

    /**
     * 删除用户
     *
     * @param ids 要删除的用户id
     * @return 结果
     */
    @PostMapping("/remove")
    @ResponseBody
    public AjaxResult remove(String ids) {
        if (ArrayUtils.contains(Convert.toLongArray(ids), getUserId())) {
            return error("当前用户不能删除自己");
        }
        return toAjax(userService.deleteUserByIds(ids));
    }

    /**
     * 跳转至重置密码页面
     *
     * @param userId 选择的用户ID
     * @param mmap   传递的属性键值对
     * @return 要跳转的页面
     */
    @GetMapping("/resetPwd/{userId}")
    public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap) {
        mmap.put("user", userService.selectUserById(userId));
        return PREFIX + "/resetPwd";
    }

    /**
     * 用户管理页面对某个用户的密码进行重置
     *
     * @param user 要重置的用户信息
     * @return 结果
     */
    @PostMapping("/resetPwd")
    @ResponseBody
    public AjaxResult resetPwdSave(SysUser user) {
        userService.checkUserAllowed(user);
        user.setSalt(ShiroUtils.randomSalt());
        user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));

        if (userService.resetUserPwd(user) > 0) {
            if (ShiroUtils.getUserId().longValue() == user.getUserId().longValue()) {
                setSysUser(userService.selectUserById(user.getUserId()));
            }
            return success();
        }
        return error();
    }

    /**
     * 用户状态修改
     *
     * @return 结果
     */
    @PostMapping("/changeStatus")
    @ResponseBody
    public AjaxResult changeStatus(SysUser user) {
        userService.checkUserAllowed(user);
        return toAjax(userService.changeStatus(user));
    }
}
